/**
 * Copyright 2006 gworks.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 */
package au.com.gworks.jump.app.wiki.server.mockimpl;

import java.io.IOException;
import java.io.InputStream;
import java.security.Principal;
import java.util.List;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.javaongems.runtime.io.PathUtils;

import au.com.gworks.jump.app.wiki.client.service.WikiRpc;
import au.com.gworks.jump.app.wiki.server.AbstractBeanMapper;
import au.com.gworks.jump.app.wiki.server.ExceptionsMapper;
import au.com.gworks.jump.io.ResourceAttributes;
import au.com.gworks.jump.io.SystemFailure;

public class ExplorerSvrController {
	private Principal requester;
	private FileSystemProvider provider;
	
	public ExplorerSvrController(String namespace, Principal rqstr) {
		requester = rqstr;
		provider = new FileSystemProvider(namespace, requester.getName());
	}
	
	public WikiRpc.ExplorerInfo fetchFolderDetails(String namespace, Integer rev, String path) 
		throws 	WikiRpc.SystemFailureException,
				WikiRpc.ResourceNotFoundException,
				WikiRpc.UnauthorisedAccessException {
		try {
			List[] data = provider.listResources(path);
			return createExplorerInfo(namespace, path, data);
		} finally {
			provider.close();
		}
	}
	
	private WikiRpc.ExplorerInfo createExplorerInfo(String namespace, String path, List[] data) {
		WikiRpc.ExplorerInfo ret = new WikiRpc.ExplorerInfo();
		ret.namespace = namespace;
		ret.timedRevision = FileSystemProvider.HEAD_REVISION;
		ret.timedDate = System.currentTimeMillis();
		ret.permission = 3;	// create folder access. ive gutted a lot out so this probably doesnt make sense
		ret.parentPath = PathUtils.toParentPath(path);
		ret.folderPath = path;
		ret.subFolders = new String[data[0].size()];
		data[0].toArray(ret.subFolders);
		int resourceSz = data[1].size();
		ret.resources = new WikiRpc.ResourceAttrInfo[resourceSz];
		for (int i = 0; i < resourceSz; i++) {
			ResourceAttributes ra = (ResourceAttributes) data[1].get(i);
			ret.resources[i] = AbstractBeanMapper.map(ra);
		}
		return ret;
	}
	
	public void uploadFiles(String changeComment, String namespace, String path, FileItem[] formFiles) throws WikiRpc.UnauthorisedAccessException,
			WikiRpc.ResourceNotFoundException, WikiRpc.ResourceConflictException, WikiRpc.SystemFailureException {
		try {
			for (int i = 0; i < formFiles.length; i++) {
				FileItem fi = formFiles[i];
				String fileName = fi.getName();
				fileName = FilenameUtils.getName(fileName);
				InputStream content = fi.getInputStream();
				try {
					String resoucePath = PathUtils.appendSlashIfRequired(path) + fileName;
					provider.writeFile(resoucePath, content);
				} finally {
					IOUtils.closeQuietly(content);
				}
			}
		} catch (IOException err) {
			SystemFailure sf = new SystemFailure(null, "unable to commit upload fileset", err);
			WikiRpc.SystemFailureException toThrow = ExceptionsMapper.map(sf);
			throw toThrow;
		}
	}
}
